package br.com.edumobi.fragments;

import android.graphics.Color;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

import java.util.List;
import java.util.Timer;
import java.util.TimerTask;

import br.com.edumobi.P;
import br.com.edumobi.R;
import br.com.edumobi.adapters.ListaAlternativasAdapter;
import br.com.edumobi.dados.modelos.Alternativa;
import br.com.edumobi.dados.modelos.Questao;

public class MEQuestaoFragment extends GenericoFragment {

    private ImageView imageViewVoltarListaQuestoesMEQuestaoFragment;
    private TextView textViewNumeroQuestaoMEQuestaoFragment;
    private TextView textViewEnunciadoMEQuestaoFragment;
    private TextView textViewObservacaoMEQuestaoFragment;
    private TextView textViewAcertouErrouMEQuestaoFragment;
    private ListView listViewAlternativasMEQuestaoFragment;
    private Button buttonVerificarRespostaMEQuestaoFragment;
    private Button buttonProximaMEQuestaoFragment;

    private AcoesMEQuestaoFragment activity;

    private List<Questao> questoes;
    private Long idAlternativaSelecionada;
    private Integer indexQuestao;
    private Integer sizeQuestoes;
    private boolean questaoVisualizadaRespondida;

    private PronunciarQuestaoTask task;
    private boolean questaoPronunciada;

    private AdapterView.OnItemClickListener clickItemlistViewAlternativasMEQuestaoFragment = new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if (!activity.obterUsuAssistente()) {
                idAlternativaSelecionada = id;
                carregarListViewAlternativas(questoes.get(indexQuestao).alternativas, idAlternativaSelecionada);
            }
        }
    };

    private View.OnClickListener clickButtonVerificarRespostaMEQuestaoFragment = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!activity.obterUsuAssistente()) {
                questaoVisualizadaRespondida = true;
                visualizarResposta();
            }
        }
    };

    private View.OnClickListener clickButtonProximaMEQuestaoFragment = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!activity.obterUsuAssistente()) {
                prepararProximaQuestao();
            }
        }
    };

    private View.OnClickListener clickImageViewVoltarListaQuestoesMEQuestaoFragment = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (!activity.obterUsuAssistente()) {
                activity.irListaDeQuestoes();
            }
        }
    };

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        activity = (AcoesMEQuestaoFragment) getActivity();

        questoes = activity.obterQuestoes();
        sizeQuestoes = questoes.size();

        if (activity.obterIndexQuestaoSelecionada() == P.INT_NULL) {
            if (indexQuestao == null) {
                indexQuestao = getIndexProximaQuestao();
            }
        } else {
            if (indexQuestao == null) {
                indexQuestao = activity.obterIndexQuestaoSelecionada();
            }
        }

        if (indexQuestao == null) {
            activity.irResultado();
        } else {
            visualizarQuestao(questoes.get(indexQuestao), indexQuestao);
        }
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_me_questao, container, false);

        imageViewVoltarListaQuestoesMEQuestaoFragment = (ImageView) view.findViewById(R.id.imageViewVoltarListaQuestoesMEQuestaoFragment);
        textViewNumeroQuestaoMEQuestaoFragment = (TextView) view.findViewById(R.id.textViewNumeroQuestaoMEQuestaoFragment);
        textViewEnunciadoMEQuestaoFragment = (TextView) view.findViewById(R.id.textViewEnunciadoMEQuestaoFragment);
        textViewObservacaoMEQuestaoFragment = (TextView) view.findViewById(R.id.textViewObservacaoMEQuestaoFragment);
        textViewAcertouErrouMEQuestaoFragment = (TextView) view.findViewById(R.id.textViewAcertouErrouMEQuestaoFragment);
        listViewAlternativasMEQuestaoFragment = (ListView) view.findViewById(R.id.listViewAlternativasMEQuestaoFragment);
        buttonVerificarRespostaMEQuestaoFragment = (Button) view.findViewById(R.id.buttonVerificarRespostaMEQuestaoFragment);
        buttonProximaMEQuestaoFragment = (Button) view.findViewById(R.id.buttonProximaMEQuestaoFragment);

        listViewAlternativasMEQuestaoFragment.setOnItemClickListener(clickItemlistViewAlternativasMEQuestaoFragment);
        buttonVerificarRespostaMEQuestaoFragment.setOnClickListener(clickButtonVerificarRespostaMEQuestaoFragment);
        buttonProximaMEQuestaoFragment.setOnClickListener(clickButtonProximaMEQuestaoFragment);
        imageViewVoltarListaQuestoesMEQuestaoFragment.setOnClickListener(clickImageViewVoltarListaQuestoesMEQuestaoFragment);

        if (questaoVisualizadaRespondida) {
            visualizarResposta();
        }

        return view;
    }

    @Override
    public void exibirComponentes() {
        imageViewVoltarListaQuestoesMEQuestaoFragment.setVisibility(View.VISIBLE);
        textViewNumeroQuestaoMEQuestaoFragment.setVisibility(View.VISIBLE);
        textViewEnunciadoMEQuestaoFragment.setVisibility(View.VISIBLE);
        textViewObservacaoMEQuestaoFragment.setVisibility(View.VISIBLE);
        textViewAcertouErrouMEQuestaoFragment.setVisibility(View.VISIBLE);
        listViewAlternativasMEQuestaoFragment.setVisibility(View.VISIBLE);
        buttonVerificarRespostaMEQuestaoFragment.setVisibility(View.VISIBLE);
        buttonProximaMEQuestaoFragment.setVisibility(View.VISIBLE);
    }

    @Override
    public void esconderComponentes() {
        imageViewVoltarListaQuestoesMEQuestaoFragment.setVisibility(View.GONE);
        textViewNumeroQuestaoMEQuestaoFragment.setVisibility(View.GONE);
        textViewEnunciadoMEQuestaoFragment.setVisibility(View.GONE);
        textViewObservacaoMEQuestaoFragment.setVisibility(View.GONE);
        textViewAcertouErrouMEQuestaoFragment.setVisibility(View.GONE);
        listViewAlternativasMEQuestaoFragment.setVisibility(View.GONE);
        buttonVerificarRespostaMEQuestaoFragment.setVisibility(View.GONE);
        buttonProximaMEQuestaoFragment.setVisibility(View.GONE);
    }

    private void visualizarQuestao(Questao questao, int indexQuestao) {
        textViewNumeroQuestaoMEQuestaoFragment.setText(String.valueOf(indexQuestao + 1) + "/" + String.valueOf(sizeQuestoes));
        textViewEnunciadoMEQuestaoFragment.setText(questao.enunciado);
        textViewObservacaoMEQuestaoFragment.setText(questao.observacao);
        buttonVerificarRespostaMEQuestaoFragment.setBackgroundColor(Color.parseColor("#ffcdcdcd"));

        carregarListViewAlternativas(questao.alternativas, idAlternativaSelecionada);

        if (!questaoPronunciada) {
            pronunciarQuestao(questao);
        }
    }

    public void repetirPronunciaQuestao() {
        pronunciarQuestao(questoes.get(indexQuestao));
    }

    private void pronunciarQuestao(final Questao questao) {
        if (activity.obterUsuAssistente()) {

            questaoPronunciada = true;

            if (task == null || task.getStatus().equals(AsyncTask.Status.FINISHED)) {
                new Timer().schedule(new TimerTask() {
                    @Override
                    public void run() {
                        task = new PronunciarQuestaoTask();
                        task.execute(questao);
                    }
                }, 1000);
            }
        }
    }

    public void pronunciarResposta(int indexAlternativa) {
        idAlternativaSelecionada = questoes.get(indexQuestao).alternativas.get(indexAlternativa).id;

        questoes.get(indexQuestao).respondida = true;

        if (questoes.get(indexQuestao).alternativaCorreta.id.equals(idAlternativaSelecionada)) {
            activity.falarTextoNaFila(R.string.voce_acertou);
            questoes.get(indexQuestao).acertou = true;
        } else {
            activity.falarTextoNaFila(R.string.voce_errou);
            questoes.get(indexQuestao).acertou = false;
        }

        activity.salvarResposta(questoes.get(indexQuestao));
        activity.falarTextoNaFila(R.string.vamos_proxima_questao);

        questaoVisualizadaRespondida = true;

        prepararProximaQuestao();
    }

    private void prepararProximaQuestao() {
        exibirComponentes();

        textViewAcertouErrouMEQuestaoFragment.setVisibility(View.GONE);
        textViewObservacaoMEQuestaoFragment.setVisibility(View.GONE);
        buttonProximaMEQuestaoFragment.setVisibility(View.GONE);

        indexQuestao = getIndexProximaQuestao();
        idAlternativaSelecionada = null;
        questaoVisualizadaRespondida = false;
        questaoPronunciada = false;

        if (indexQuestao == null) {
            activity.irResultado();
        } else {
            visualizarQuestao(questoes.get(indexQuestao), indexQuestao);
        }
    }

    private void visualizarResposta() {
        if (idAlternativaSelecionada != null) {

            esconderComponentes();
            textViewAcertouErrouMEQuestaoFragment.setVisibility(View.VISIBLE);
            textViewObservacaoMEQuestaoFragment.setVisibility(View.VISIBLE);
            buttonProximaMEQuestaoFragment.setVisibility(View.VISIBLE);

            questoes.get(indexQuestao).respondida = true;

            if (questoes.get(indexQuestao).alternativaCorreta.id.equals(idAlternativaSelecionada)) {
                textViewAcertouErrouMEQuestaoFragment.setTextColor(Color.parseColor("#ff0a8cbf"));
                textViewAcertouErrouMEQuestaoFragment.setText(R.string.voce_acertou);
                questoes.get(indexQuestao).acertou = true;
            } else {
                textViewAcertouErrouMEQuestaoFragment.setTextColor(Color.parseColor("#fff02100"));
                textViewAcertouErrouMEQuestaoFragment.setText(R.string.voce_errou);
                questoes.get(indexQuestao).acertou = false;
            }

            activity.salvarResposta(questoes.get(indexQuestao));
        }
    }

    private void carregarListViewAlternativas(List<Alternativa> alternativas, Long idAlternativaSelecionada) {
        if (idAlternativaSelecionada != null) {
            listViewAlternativasMEQuestaoFragment.setAdapter(new ListaAlternativasAdapter(alternativas, idAlternativaSelecionada));
            buttonVerificarRespostaMEQuestaoFragment.setBackgroundColor(Color.parseColor("#ff0a8cbf"));
        } else {
            listViewAlternativasMEQuestaoFragment.setAdapter(new ListaAlternativasAdapter(alternativas));
        }
    }

    private Integer getIndexProximaQuestao() {
        if (indexQuestao == null) {
            for (int index = 0; index < sizeQuestoes; index++) {
                if (!questoes.get(index).respondida) {
                    return index;
                }
            }
        } else {
            if (indexQuestao + 1 >= sizeQuestoes) {
                for (int index = 0; index < sizeQuestoes; index++) {
                    if (!questoes.get(index).respondida) {
                        return index;
                    }
                }
            } else {
                if (!questoes.get(indexQuestao + 1).respondida) {
                     return indexQuestao + 1;
                } else {
                    for (int index = 0; index < sizeQuestoes; index++) {
                        if (!questoes.get(index).respondida) {
                            return index;
                        }
                    }
                }
            }
        }

        return null;
    }

    private class PronunciarQuestaoTask extends AsyncTask<Questao, Void, Void> {

        @Override
        protected Void doInBackground(Questao... params) {
            Questao questao = params[0];

            activity.falarTextoNaFila(questao.enunciado);

            for (Alternativa alternativa : questao.alternativas) {
                activity.falarTextoNaFila(getActivity().getResources().getString(R.string.alternativa));
                activity.falarTextoNaFila(ListaAlternativasAdapter.letras[questao.alternativas.indexOf(alternativa)]);
                activity.falarTextoNaFila(alternativa.alternativa);
            }

            return null;
        }

        @Override
        protected void onPostExecute(Void aVoid) {
            super.onPostExecute(aVoid);

            while (true) {
                if (!activity.falando()) {
                    activity.obterVoiceAction();
                    break;
                }
            }
        }
    }

    public interface AcoesMEQuestaoFragment extends AcoesGenericoFragment {
        List<Questao> obterQuestoes();
        int obterIndexQuestaoSelecionada();
        void salvarResposta(Questao questao);
        void irListaDeQuestoes();
        void irResultado();
        void obterVoiceAction();
        boolean obterUsuAssistente();
    }
}